【Linux驱动】内核模块编译 |
您所在的位置:网站首页 › linux 驱动安装 ko › 【Linux驱动】内核模块编译 |
编译驱动一般采用的是将驱动编译成模块(.ko 文件),然后加载到内核,这其中就用到了 make modules 命令。 目录 一、单模块编译 1、一个 c 文件编译成一个 ko 文件 2、多个文件编译成一个 ko 文件 二、多模块编译(多文件多模块) 一、单模块编译 1、一个 c 文件编译成一个 ko 文件下面是最简易的单文件单模块编译,假设我们要将源文件 chrdevbase.c 编译成 ko 文件。 KERNEL_DIR := /home/pigeon/workspace/imx6ull-kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek CURRENR_DIR := $(shell pwd) obj-m := chrdevbase.o build: kernel_modules kernel_modules: $(MAKE) -C $(KERNEL_DIR) M=$(CURRENR_DIR) modules .PHONY:clean clean: $(MAKE) -C $(KERNEL_DIR) M=$(CURRENR_DIR) cleanKERNEL_DIR := xxx KERNEL_DIR 代表内核源码的位置,后续 make modules 会用到 CURRENR_DIR := xxx CURRENR_DIR 代表当前模块源文件所在的路径 obj-m := chrdevbase.o obj-m 表示把文件 chrdevbase.o 作为"模块"编译,不会编译进内核,但会生成一个独立的 ko 文件 obj-y 则是直接编译进内核,即加入到内核源码中 $(MAKE) -C $(KERNEL_DIR) M=$(CURRENR_DIR) modules 这一句我们拆成两个阶段,由简入繁分析。-C $(KERNEL_DIR) 代表切换工作目录,因为内核源码顶层的Makefile文件定义了伪目标 modules,所以要先将工作目录切换到内核源码顶层 Makefile 所在位置。 make modules -C $(KERNEL_DIR)M=$(CURRENR_DIR) 表示回到当前路径继续执行当前的Makefile。这个可以让makefile 回到自己所指定的目录下查找模块源码,将其编译,生成 ko 文件。 make modules -C $(KERNEL_DIR) M=$(CURRENR_DIR) 2、多个文件编译成一个 ko 文件假设我们要将 add.c、sub.c 编译成一个ko文件,只有 add.c 包含了模块初始化函数(module_init),sub.c 只是add.c 的依赖源文件。大体和上面单文件单模块类似,不同之处如下: obj-m += 模块名.o模块名-objs += 源文件名.o ...如: obj-m +=: calc.ocalc-objs += add.o sub.o KERNEL_DIR := /home/pigeon/workspace/imx6ull-kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek CURRENR_DIR := $(shell pwd) obj-m += calc.o # obj-m += 模块名.o calc-objs := add.o sub.o # 模块名-objs += 源文件名.o ... build: kernel_modules kernel_modules: $(MAKE) -C $(KERNEL_DIR) M=$(CURRENR_DIR) modules .PHONY:clean clean: $(MAKE) -C $(KERNEL_DIR) M=$(CURRENR_DIR) clean 二、多模块编译(多文件多模块)从上面《多文件单模块》可以了解到 obj-m 指定最终模块名,-objs 指定依赖源文件列表。所以如果要生成多个模块,那就需要通过 obj-m 指定,而且最终模块名要和源文件名对应。 KERNEL_DIR := /home/pigeon/workspace/imx6ull-kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek CURRENR_DIR := $(shell pwd) obj-m += hello.o calculate.o # 需要存在对应的 hello.c 和 calculate.c 文件 build: kernel_modules kernel_modules: $(MAKE) -C $(KERNEL_DIR) M=$(CURRENR_DIR) modules .PHONY:clean clean: $(MAKE) -C $(KERNEL_DIR) M=$(CURRENR_DIR) clean |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |